﻿using System;
using System.Collections.Generic;
using System.Collections;

public class ColUsuarios : ColEntidades
{
    #region Constructor

    /**
        * \brief Constructor de ColUsuarios.
        * \return El ColUsuarios creado.
        */
    public ColUsuarios(): base() 
    {
        //Sin código
    }
        
    /**
        * \brief Constructor de copia de ColUsuarios.
        * \param pColUsuarios ColUsuarios sobre el que realizar la copia
        * \return ColUsuarios creado y listo para usar.
        */
    protected ColUsuarios(ColUsuarios pColUsuarios)
    {
        foreach (Usuario usuario in pColUsuarios)
            this.añadir((Usuario)usuario.dameCopiaEntidad());
    }

    #endregion

    #region Métodos de Consulta

    /**
        * \brief Obtiene el usuario según el id de sus datos.
        * \pre El identificador del usuario debe ser correcto.
        * \param pId - Id de lo datos de la usuario.
        * \return Devuelve el usuario cuyos datos son los pasados por parámetros.
        */
    public virtual Usuario getUsuarioById(ulong pId)
    {
        Usuario usuario = null;

        foreach (Usuario u in this.miColeccion) 
        {
            if(u.MisDatos.Id.Equals(pId))
            {
                usuario = u;
                break;
            }
        }
        return usuario;
    }

    #endregion

    #region Métodos de Operación

    /**
    * \brief Función que comprueba si una entidad esta dentro de una colección.
    * \pre La entidad tiene que ser correcto.
    * \param pElemento - entidad que se va a comprobar si se encuentra dentro de una colección.
    * \return TRUE si el elemento pertenece a la colección y FALSE si el elemento no pertenece a la colección.
    */
    public bool existe(Usuario pElemento)
    {
        return base.existe(pElemento);
    }
    /**
        * \brief Función que añade una entidad a una colección.
        * \pre La entidad tiene que ser correcto.
        * \param pElemento - entidad que se va a añadir.
        */
    public void añadir(Usuario pElemento) 
    {
        base.añadir(pElemento);
    }
    /**
        * \brief Función que elimina una entidad que esta dentro de una colección
        * \pre La entidad tiene que ser correcto.
        * \param pElemento - entidad que se va a eliminar.
        */
    public void eliminar(Usuario pElemento) 
    {
        base.eliminar(pElemento);
    }
    /**
        * \brief Función que añade una colección a la colección existente.
        * \pre La coleccion tiene que ser correcta.
        * \param pColeccion - coleccion que se va a añadir.
        */
    public void añadirColeccion(ColUsuarios pColeccion)
    {
        base.añadirColeccion(pColeccion);
    }
    /**
    * \brief Función que elimina una colección.
    * \pre La coleccion tiene que ser correcta.
    * \param pColeccion - coleccion que se va a eliminar.
    */
    public void eliminarColeccion(ColUsuarios pColeccion)
    {
        base.eliminarColeccion(pColeccion);
    }

    #endregion

    #region Clases de comparación

    private class NombreComparer : IComparer
    {
        public int Compare(Object x, Object y)
        {
            Usuario x_ = (Usuario)x, y_ = (Usuario)y;
            return x_.MisDatos.Nombre.CompareTo(y_.MisDatos.Nombre);
        }
    }

    private class LoginComparer : IComparer
    {
        public int Compare(Object x, Object y)
        {
            Usuario x_ = (Usuario)x, y_ = (Usuario)y;
            return x_.MisDatos.Login.CompareTo(y_.MisDatos.Login);
        }
    }

    #endregion

    #region Métodos adicionales

    internal override ColEntidades dameCopiaColeccionEntidades()
    {
        return new ColUsuarios(this);
    }

    #endregion

}